# -*- coding: utf-8 -*-            
# @Author : HJH
# @Time : 2024/1/22 14:58
# @Use : 去哪儿单程统一政策
import json


class Policy:
    def __init__(
            self,
            policyCode: str = None,
            status: str = None,
            carrier: str = None,
            dpt: str = None,
            arr: str = None,
            cabin: str = None,
            flightNoLimit: str = None,
            flightCondition: str = None,
            shared: str = None,
            actCarrier: str = None,
            stop: str = None,
            dptDateStart: str = None,
            dptDateEnd: str = None,
            dayCondition: str = None,
            productMark: str = None,
            saleAvailable: str = None,
            supportCba: str = None,
            saleDateStart: str = None,
            saleDateEnd: str = None,
            lockTime: str = None,
            earliestBeforeTicket: str = None,
            beforeTicket: str = None,
            cardType: str = None,
            printSource: str = None,
            printPrice: str = None,
            printReturnPoint: str = None,
            printReturnPrice: str = None,
            policyReturnPoint: str = None,
            policyReturnPrice: str = None,
            autoPriceThreshold: str = None,
            percentPriceThreshold: str = None,
            preOfficeNo: str = None,
            needPnr: str = None,
            highDemandType: str = None,
            highDemandThreshold: str = None,
            needPata: str = None,
            returnRule: str = None,
            changeRule: str = None,
            cabinNote: str = None,
    ):
        """
        该节点描述需要新增的政策内容
        """
        """
            百分比追价阈值	否	选填，仅支持0~99.99的正数，最多支持两位小数，默认为 0
        """
        self.percentPriceThreshold = percentPriceThreshold
        """
            可售卖范围	否	普通人群/采购人群
        """
        self.saleAvailable = saleAvailable
        """
            支持儿童买成人	是	是/否，录入“是”代表此政策可供儿童买成人。不填默认支持，如果不支持请主动改为“否”
        """
        self.supportCba = supportCba
        """
            政策标识	否	代理商内部政策代码，用于标识内部的政策
        """
        self.policyCode = policyCode
        """
            政策有效性	是	有效/挂起/删除/失效/待确认
        """
        self.status = status
        """
            航空公司	是	航空公司二字码，必须大写，只支持一个航空公司
        """
        self.carrier = carrier
        """
            出发机场	是	录入*表示支持全部起飞机场的录入，出发机场三字代码，大写，多个机场用英文”,”分隔。
        """
        self.dpt = dpt
        """
            到达机场	是	录入*表示支持全部起飞机场的录入，到达机场三字代码，大写，多个机场用英文”,”分隔。
        """
        self.arr = arr
        """
            使用舱位	是	录入*代表全部舱位，多个舱位之间不需要分隔符，支持子舱，例如：FCXM1
        """
        self.cabin = cabin
        """
            航班号限制	是	航班限制，取值如下：所有、适用、不适用
        """
        self.flightNoLimit = flightNoLimit
        """
            航班号	否	支持录入多个航班与航班范围，范围之间用“-”链接，多个航班之间用英文“,”分隔。单个航班需要在航班范围前录入。
            例:CA1145,CA1501, CA1800-CA1899
        """
        self.flightCondition = flightCondition
        """
            支持共享航班	否	取值“是”或“否”
        """
        self.shared = shared
        """
            限制主飞航司	否	选填，航司二字码，仅限选择支持共享航班且产品类型录入在 1000-1999 范围时支持录入限制主飞航司，不录不限制。
        """
        self.actCarrier = actCarrier
        """
            支持经停航班	否	取值“是”或“否”
        """
        self.stop = stop
        """
            有效航班起飞日期起始	是	格式为 yyyy-MM-dd
        """
        self.dptDateStart = dptDateStart
        """
            有效航班起飞日期截止	是	格式为 yyyy-MM-dd，日期不能早于旅行起始日期
        """
        self.dptDateEnd = dptDateEnd
        """
            班期限制	是	1234567 表示周一、周二、周三、周四、周五、周六、周日，不能为空
        """
        self.dayCondition = dayCondition
        """
            产品类型	否	选填，非负整数，只能录入已授权产品类型，支持多mark投放,默认为-1
        """
        self.productMark = productMark
        """
            销售日期起始	是	格式为 yyyy-MM-dd
        """
        self.saleDateStart = saleDateStart
        """
            销售日期截止	是	格式为 yyyy-MM-dd，日期不能早于销售起始日期
        """
        self.saleDateEnd = saleDateEnd
        """
            起飞前截止销售时间	否	选填，正整数，输入范围[60,180]，不在范围内的数值默认为 120. （单位：分钟）
        """
        self.lockTime = lockTime
        """
            最提前出票时限	否	选填，含当天，正整数有效，不能小于最晚提前出票时限！例如：最早出票时限为 5，用户至多提前 5 天预订机票。（单位：天）
        """
        self.earliestBeforeTicket = earliestBeforeTicket
        """
            最晚提前出票时限	否	选填，含当天，正整数有效。例如：最晚出票时限为 2，用户至少需要提前 2 天预订机票。（单位：天）
        """
        self.beforeTicket = beforeTicket
        """
            证件类型	否	0， 支持所有证件类型1，只支持身份证购买默认为 0，支持所有证件类型
        """
        self.cardType = cardType
        """
            运价类型	是	公布运价/私有运价/直减运价/指定票面价/官网价格/旗舰店价格/飞耶官网价格/飞耶旗舰店价格
        """
        self.printSource = printSource
        """
            票面价	是	运价类型选‘指定票面价’时必填。票面价只能是正整数。
        """
        self.printPrice = printPrice
        """
            票面价返点	否	选填，默认 0，最多支持两位小数，支持正负，指定票面价无须填写
        """
        self.printReturnPoint = printReturnPoint
        """
            票面价留钱	否	选填，默认 0，仅支持正负整数，指定票面价无须填写
        """
        self.printReturnPrice = printReturnPrice
        """
            政策价返点		只支持数字输入，最多支持两位小数，如：15.25，代表返点 15.25
        """
        self.policyReturnPoint = policyReturnPoint
        """
            政策价留钱		支持正负整数输入
        """
        self.policyReturnPrice = policyReturnPrice
        """
            追价阈值	否	选填，仅支持正整数或 0，默认为 0
        """
        self.autoPriceThreshold = autoPriceThreshold
        """
            是否生成PNR	是	取值“是”或“否”
        """
        self.needPnr = needPnr
        """
            紧俏座位处理	否	不处理/生 PNR/禁售，仅是否生成 PNR 选否时填写有效，代表 AV 校验剩余座位数低于阈值时的处理方式
        """
        self.highDemandType = highDemandType
        """
            紧俏座位阈值	否	判断紧俏座位数的阈值
        """
        self.highDemandThreshold = highDemandThreshold
        """
            预定 office 号 否 创建 PNR 时所使用的 OFFICE 号，必须在代理商 PID 列表中存在。可以为空，系统使用代理商列表中有权的 office
        """
        self.preOfficeNo = preOfficeNo
        """
            是否进行PAT：A校验	是	取值“是”或“否”
        """
        self.needPata = needPata
        """
            退票规则	是	退票手续费编号
            如 10-2-20，表示起飞前 2 小时之前的手续费比例是 10%，起飞前 2 小时之后的手续费比例是 20%，具体见“新规则退改签录入”。
        """
        self.returnRule = returnRule
        """
            改期规则	是	改期手续费编号
            如 10-2-20，表示起飞前 2 小时之前的手续费比例是 10%，起飞前 2 小时之后的手续费比例是 20%，具体见“新规则退改签录入”
        """
        self.changeRule = changeRule
        """
            舱位说明	是	最大不超过 255 个字符
        """
        self.cabinNote = cabinNote


class PolicyList:
    def __init__(
            self,
            username: str = None,
            password: str = None,
            execType: str = None,
            type: str = None,
            url: str = None,
            ext: str = None
    ):
        """
        该节点定义新增政策的类型并出示用户名和密码
        """
        """
            用户名	是	政策上传的用户名
        """
        self.username = username
        """
            密码	是	政策上传的密码
        """
        self.password = password
        """
            上传类型	是	只能取 ADD、FULL 
            ADD表示增量上传；FULL表示全量上传
        """
        self.execType = execType
        """
            政策类型	是	政策类型
            SINGLE 表示单程统一 
        """
        self.type = type
        """
            回调地址	否	本次上传结果通知代理商时的回调地址。如果不填，默认会使用tts 后台开通功能时账号录入的回调地址
        """
        self.url = url
        """
            扩展信息	否	政策操作结果回调信息会返回此字段
        """
        self.ext = ext


class DeletePolicy:
    def __init__(
            self,
            policyCode: str = None,
            type: str = None,
            flightcode: str = None,
            dpt: str = None,
            arr: str = None,
            cabin: str = None,
            startdate: str = None,
            enddate: str = None,
    ):
        """
        该节点定义新增政策的类型并出示用户名和密码
        """
        """
            旅行结束日期（往返政策对应去程旅行结束日期）	否	格式为 yyyy-MM-dd，日期不能早于旅行起始日期
        """
        self.enddate = enddate
        """
            旅行起始日期（往返政策对应去程旅行起始日期）	否	格式为 yyyy-MM-dd，日期不能早于当天
        """
        self.startdate = startdate
        """
            舱位(往返政策对应去程舱位)	否	舱位代码，大写且只支持单个舱位的录入，不支持子舱位
        """
        self.cabin = cabin
        """
            目的地	否	到达机场三字码，大写且只支持单个目的地
        """
        self.arr = arr
        """
            出发地	否	出发机场三字代码，大写且只支持单个出发地
        """
        self.dpt = dpt
        """
            航空公司	否	航空公司二字码，必须大写，只支持一个航空公司
        """
        self.flightcode = flightcode
        """
            政策类型	是	政策类型
            SINGLE 表示单程统一 
        """
        self.type = type
        """
            政策标识	否	代理商内部政策代码，用于标识内部的政策
        """
        self.policyCode = policyCode
